<?php
def("amicitia/persistencia/daos/","DaoGrupo");
def("amicitia/persistencia/daos/","ConexionBD");
def("amicitia/modelo/entidades/","Grupo");
def("amicitia/persistencia/excepciones/","IntegridadDatosException");

/**
 * Maneja todas las consideraciones de persistencia para con la entidad Grupo.
 * 
 * @author Willy A. Kuster
 */
class DaoGrupoMySql implements DaoGrupo {
	
	const SELECT_GRUPO = "SELECT id, nombre, password, esvisible FROM grupo WHERE id=%s";
	const INSERT_GRUPO = "INSERT INTO grupo (id,nombre,password,esvisible) VALUES (%s,%s,SHA1(%s),%s)";
	const DELETE_GRUPO = "DELETE FROM grupo WHERE id=%s";

	private $conexion;

	public function __construct() {
		$this->conexion = ConexionBD::getConexionBD();
		//$this->conexion->conectar();
	}
	
	/**
	 * @see persistencia/daos/DaoGrupo#obtenerGrupo($id)
	 */
	public function obtenerGrupo($id) {
		$id = $this->conexion->escaparCadena($id);
		$query = sprintf(self::SELECT_GRUPO,$id);
		$result = $this->conexion->seleccionar($query);

		if($obj = $result->fetch_object()){
			$grupo = new Grupo();
			$grupo->setId($obj->id);
			$grupo->setNombre($obj->nombre);
			$grupo->setPassword($obj->password);
			$grupo->setEsVisible((bool)$obj->esvisible);

			$result->close();

			return $grupo;
		} else {
			return NULL;
		}
	}
	
	/**
	 * @see persistencia/daos/DaoGrupo#guardarGrupo($grupo)
	 */
	public function guardarGrupo(Grupo $grupo) {
		
		$this->verificarGrupo($grupo);
		
		$id = is_null($grupo->getId()) ? "NULL" : (int)$this->conexion->escaparCadena($grupo->getId());
		$nombre = "'".$this->conexion->escaparCadena($grupo->getNombre())."'";
		$password = "'".$this->conexion->escaparCadena($grupo->getPassword())."'";
		$esVisible = is_null($grupo->getEsVisible()) ? "DEFAULT" : (int)$this->conexion->escaparCadena($grupo->getEsVisible());
		
		$query = sprintf(self::INSERT_GRUPO,$id,$nombre,$password,$esVisible);
		$id = $this->conexion->insertar($query);
		return $id;
		
	}
	
	/**
	 * @see persistencia/daos/DaoGrupo#eliminarGrupo($id)
	 */
	public function eliminarGrupo($id) {
		
		$id = $this->conexion->escaparCadena($id);
		$query = sprintf(self::DELETE_GRUPO,$id);
		$afectados = $this->conexion->actualizarOEliminar($query);
		
		if ($afectados==1) {
			return true;
		} else {
			return false;
		}
		
	}
	
	/**
	 * Verifica la integridad del objeto Grupo que se pase por parámetro.
	 * 
	 * @param $grupo
	 * 			Un objeto Grupo.
	 */
	private function verificarGrupo(Grupo $grupo) {
		if(is_null($grupo->getNombre()) || $grupo->getNombre()=="")
			throw new IntegridadDatosException(get_class($grupo),"nombre",$grupo->getNombre());
		if(is_null($grupo->getPassword()) || $grupo->getPassword()=="")
			throw new IntegridadDatosException(get_class($grupo),"password",$grupo->getPassword());
	}
	
}
?>